// 安装joi 包，为表单中携带的每个数据项，定义验证规则 npm install joi
// 安装 @escook/express-joi 中间件，来实现自动对表单数据进行验证的功能 npm i @escook/express-joi
/**
 * string() 值必须是字符串
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * min(length) 最小长度
 * max(length) 最大长度
 * required() 值是必填项，不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 */
// 导入定义验证规则的包
const joi = require('joi')

//定义用户名和密码的验证规则
const username = joi.string().alphanum().min(1).max(10).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()


// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
    // 表示需要对 req.body 中的数据进行验证
    body: {
        username,
        password,
    },
    //   // 表示需要对 req.query 中的数据进行验证
    //   query: {
    //     username,
    //     password,
    //   },
    //     // 表示需要对 req.params 中的数据进行验证
    //     params: {
    //     username,
    //     password,
    //   },
}

// 定义更新用户 id, nickname, emial 的验证规则
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()

// 验证规则对象 - 更新用户基本信息
exports.update_userinfo_schema = {
    body: {
        id,
        nickname,
        email,
    },
}

// 定义更新密码的验证规则
const updatePwd = joi.string().pattern(/^[\S]{6,12}$/).required()
// 验证规则对象 - 更新用户密码
exports.update_password_schema = {
    body: {
        // 使用 updatePwd 这个规则，验证 req.body.oldPwd 的值
        oldPwd: updatePwd,
        // 使用 joi.not(joi.ref('oldPwd')).concat(updatePwd) 规则，验证 req.body.newPwd 的值
        // 解读：
        // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
        // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
        // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 updatePwd 这两条验证规则
        newPwd: joi.not(joi.ref('oldPwd')).concat(updatePwd),
    },
}

// 定义头像的验证规则
// dataUri() 指的是如下格式的字符串数据：
// 
const avatar = joi.string().dataUri().required()
// 验证规则对象 - 更新头像
exports.update_avatar_schema = {
    body: {
        avatar,
    },
}

